﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SuperKit
{
    /*
     * 这个功能和SplitFilePage相似，但是他的对象是目录，而不是文件。
     * 先计算每一个目录中的文件数量，然后按照Page数量分成指定的目录PAGE。
     * 和分类文件不同，使用MaxPage来计算
     */
    class SplitDirPage : CommandExecutor {
        private class Page {
            public List<string> files;

            public Page(int pageCount) {
                files = new List<string>(pageCount);
            }

            public void Add(string f) {
                files.Add(f);
            }

            public void MoveTo(string dir) {
                foreach (var i in files) {
                    // 根据是目录还是文件，做不同的操作
                    if (Directory.Exists(i)) {
                        DirectoryInfo info = new DirectoryInfo(i);
                        string path = Path.Combine(dir, info.Name);
                        Directory.Move(info.FullName, path);
                    } else {
                        FileInfo info = new FileInfo(i);
                        string path = Path.Combine(dir, info.Name);
                        File.Move(info.FullName, path);
                    }
                }
            }
        }

        private string[] dirs;
        // 文件分离的数量
        private int pageCount;
        // 分成多少页
        private int maxPage;

        public SplitDirPage(ArgReader arg, IExecutorOwner form, string fpath) : base(arg, form, fpath) {
            maxPage = arg.GetInteger("-maxPage", 2);
        }

        public override void Execute() {
            base.Execute();
            
            dirs = GetSortFiles(FilePath);

            // 得到总数
            int total = 0;
            foreach (var i in dirs) {
                // 如果是目录，得到文件数量，如果是文件，则直接+1
                total += KFile.GetAllFileCount(i);
            }

            // 得到每个目录的数量
            pageCount = total / maxPage;

            // 依次将目录塞入Page
            var pages = new Page[maxPage];
            for (int i = 0; i < pages.Length; i++) {
                pages[i] = new Page(pageCount);
            }

            int pointer = 0;
            int count = 0;
            for (int i = 0; i < dirs.Length; i++) {
                // 加入一个项目之后，就给count增加数量
                pages[pointer].Add(dirs[i]);
                // 如果是目录，得到文件数量，如果是文件，则直接+1
                count += KFile.GetAllFileCount(dirs[i]);

                // 如果count数量够了，就移到下一个PAGE
                if (count >= pageCount) {
                    count = 0;
                    if (pointer + 1 < maxPage) {
                        pointer += 1;
                    }
                }
            }

            // 将每一个分页输出
            for (int i = 0; i < maxPage; i++) {
                var name = $"{Path.GetFileName(FilePath)}_{i + 1}";
                var dir = Path.Combine(FilePath, name);
                if (!Directory.Exists(dir)) {
                    Directory.CreateDirectory(dir);
                }
                pages[i].MoveTo(dir);
            }

            End();
        }



        public static string[] GetSortFiles(string path) {
            DirectoryInfo dir = new DirectoryInfo(path);
            var dirs = dir.GetDirectories();
            var files = dir.GetFiles();

            List<string> list = new List<string>();
            foreach (var i in dirs) {
                list.Add(i.FullName);
            }
            foreach (var i in files) {
                list.Add(i.FullName);
            }
            list.Sort((a, b) => {
                return a.CompareTo(b);
            });
            return list.ToArray();
        }
    }
}
